/**
 * 生成唯一的ID
 *
 * 该函数通过结合当前时间和一个随机数来生成一个唯一的ID
 * 使用了Date.now()获取当前时间戳，Math.random()生成一个随机数，
 * 并将其转换为36进制字符串，然后截取字符串的第2到第9个字符，
 * 最终拼接成一个格式为"id-时间戳-随机数"的字符串
 *
 * @returns {string} 返回生成的唯一ID
 */
export function generateUniqueId() {
  return "id-" + Date.now() + "-" + Math.random().toString(36).substring(2, 9);
}

/**
 * 深度复制一个对象或数组
 * @param {object|array} target - 需要深度复制的目标对象或数组
 * @param {WeakMap} visited - 用于处理循环引用的弱引用映射，默认为新的弱引用映射
 * @returns {object|array} - 深度复制后的对象或数组
 */
export function deepCopy(target, visited = new WeakMap()) {
  // 处理非对象类型和null
  if (typeof target !== "object" || target === null) {
    return target;
  }

  // 处理循环引用
  if (visited.has(target)) {
    return visited.get(target);
  }

  // 处理特殊对象类型
  if (target instanceof Date) {
    return new Date(target);
  }
  if (target instanceof RegExp) {
    return new RegExp(target);
  }

  // 初始化拷贝对象
  const result = Array.isArray(target)
    ? []
    : Object.create(Object.getPrototypeOf(target));

  visited.set(target, result);

  // 处理数组（使用for循环避免稀疏数组问题）
  if (Array.isArray(target)) {
    for (let i = 0; i < target.length; i++) {
      result[i] = deepCopy(target[i], visited);
    }
  }
  // 处理普通对象
  else {
    for (const key in target) {
      if (Object.prototype.hasOwnProperty.call(target, key)) {
        result[key] = deepCopy(target[key], visited);
      }
    }
  }

  return result;
}
